//
//  main.m
//  Memory1
//
//  Created by cora1n on 14-8-11.
//  Copyright (c) 2014年 devwu. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
    //字面量存储在内存中的静态常量区,不属于开发者控制
//    NSString * str = @"hello";
    
    
//    NSString * p1 = [[NSString alloc]initWithFormat:@"hello"];
    Person * p1 = [[Person alloc]init];
    p1.name = @"zhangsan";
    // 1
    NSLog(@"p1的引用计数为 %lu",p1.retainCount);
    //1.引用计数: 实质就是该对象被多少人使用
    //ObjC中所有NSObject的子类都有一个自己的引用计数,
    //每当一个对象被创建出来时,它的引用计数 默认值为1
    //当该对象被其他对象所引用(使用)时,该对象的引用计数+1
    //当其他对象不再使用该对象时,它的引用计数-1
    //直到该对象的引用计数=时,释放内存
    //如果该对象的内存得不到释放,则发生内存泄露.
    //当泄露的内存达到一定才程度时,将影响系统的运行
    
    //ObjC对于内存管理的方案
    //retain   增持,将该对象的引用计数+1
    //release  减持,将该对象的引用计数-1
    // 2
    [p1 retain];
    NSLog(@"p1的引用计数为 %lu",p1.retainCount);
    [p1 retain];
    NSLog(@"p1的引用计数为 %lu",p1.retainCount);
    [p1 retain];
    NSLog(@"p1的引用计数为 %lu",p1.retainCount);
    [p1 release];
    NSLog(@"p1的引用计数为 %lu",p1.retainCount);
    [p1 release];
    NSLog(@"p1的引用计数为 %lu",p1.retainCount);
    [p1 release];
    NSLog(@"p1的引用计数为 %lu",p1.retainCount);
    //当该对象的引用计数为0时,调用它的dealloc方法,完成内存的释放
    [p1 release];
    //当引用计数为0时,再次释放,会发生运行时错误.
    //过度释放
    [p1 release];
    
    // B b1
    // A.b2 = b1 retain;
    // b1 release
    // A.b2 hi hi
    
    //将p1装在到数组中.
//    NSArray * arr1 = [NSArray arrayWithObject:p1];
//    NSArray * arr2 = [NSArray arrayWithObject:p1];
    
//    NSLog(@"p1的引用计数为 %lu",p1.retainCount);

    
    
    
    return 0;
}

